package lambda_expression;

public class App2 {

    String s1 = "全局变量";

    // 1. 匿名内部类中对于变量的访问
    public void testInnerClass(){
        String s2 = "局部变量";

        new Thread(new Runnable() {
            String s3 = "内部变量";
            @Override
            public void run() {
                // 访问全局变量
//                System.out.println(this.s1); // this关键字表示当前内部类型的对象

                System.out.println(s1);
                System.out.println(s2); // 局部变量的访问，不能对局部变量进行数据的修改【final】
                s1 = "全局01";
                System.out.println(s1);
                System.out.println(s3);
                System.out.println(this.s3);
            }
        }).start();
    }


    // 2. Lambda表达式变量捕获
    public void testLambda(){
        String s2 = "局部变量lambda";

        // 匿名内部类不会在创建一个对象级的作用域
        new Thread(() -> {
            String s3 = "内部变量lambda";
            // 访问全局变量
            System.out.println(this.s1); // this关键字，表示的就是所属方法所在类型的对象
            // 访问局部变量
            System.out.println(s2);
//            s2 = ""; // 不能对局部变量进行修改，没人推导变量修饰符为final
            System.out.println(s3);
            s3 = "lambda内部变量直接修改";
            System.out.println(s3);

        }).start();
    }


    public static void main(String[] args) {
       App2 app2 = new App2();
//       app2.testInnerClass();
        app2.testLambda();

    }

}
